package org.rslai.autotest.core.page;

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;

/**
 * Wait处理方法
 * @author rslai
 */
public interface Wait {

	/**
	 * 等待某个WebElement出现
	 * @param by
	 * @return 这个元素
	 */
	public WebElement waitForElement(final By by);

	/**
	 * 在一个元素下等待某个WebElement出现
	 * @param element
	 * @param by By，注：如果使用 xpath 搜索，要在前边加 child::node() 例：By.xpath("child::node()//span[@class='del']")
	 * @return 这个元素
	 */
	public WebElement waitForElement(final WebElement element, final By by);

	/**
	 * 等待一组WebElement出现
	 * @param by
	 * @return 一组元素
	 */
	public List<WebElement> waitForElements(final By by);

	/**
	 * 在一个元素下等待一组WebElement出现
	 * @param element
	 * @param by By，注：如果使用 xpath 搜索，要在前边加 child::node() 例：By.xpath("child::node()//span[@class='del']")
	 * @return 一组元素
	 */
	public List<WebElement> waitForElements(final WebElement element, final By by);

	/**
	 * 等待某个WebElement消失或隐藏<br>
	 * 注意：根据 xpathExpression 表达式定位到多个元素会等待第一个元素消失或隐藏
	 * @param baseBy 基准元素，只有等待该元素出现后才会判断指定元素是否可见
	 * @param xpathExpression xpath表达式
	 * @return 等到返回true，没等到报TimeoutException异常
	 */
	public boolean waitForHiddenElement(By baseBy, String xpathExpression);

	/**
	 * 等待某个WebElement消失或隐藏<br>
	 * 注意：根据 xpathExpression 表达式定位到多个元素会等待第一个元素消失或隐藏
	 * @param baseBy 基准元素，只有等待该元素出现后才会判断指定元素是否可见
	 * @param xpathExpression xpath表达式
	 * @param waitTimeout 超时时间 (秒)
	 * @return 等到返回true，没等到报TimeoutException异常
	 */
	public boolean waitForHiddenElement(By baseBy, String xpathExpression, int waitTimeout);

	/**
	 * 等待一个元素下的某个WebElement消失或隐藏<br>
	 * 注意：根据 xpathExpression 表达式定位到多个元素会等待第一个元素消失或隐藏
	 * @param baseBy 基准元素，只有等待该元素出现后才会判断指定元素是否可见
	 * @param element WebElement
	 * @param xpathExpression xpath表达式
	 * @return 等到返回true，没等到报TimeoutException异常
	 */
	public boolean waitForHiddenElement(By baseBy, WebElement element, String xpathExpression);

	/**
	 * 等待一个元素下的某个WebElement消失或隐藏<br>
	 * 注意：根据 xpathExpression 表达式定位到多个元素会等待第一个元素消失或隐藏
	 * @param baseBy 基准元素，只有等待该元素出现后才会判断指定元素是否可见
	 * @param element WebElement
	 * @param xpathExpression xpath表达式
	 * @param waitTimeout 超时时间 (秒)
	 * @return 等到返回true，没等到报TimeoutException异常
	 */
	public boolean waitForHiddenElement(By baseBy, WebElement element, String xpathExpression, int waitTimeout);

	/**
	 * 返回元素是否可见，元素不存在或者"style"属性为不显示都返回false<br>
	 * 注意：根据 xpathExpression 表达式定位到多个元素会返回第一个元素是否可见
	 * @param baseBy 基准元素，只有等待该元素出现后才会判断指定元素是否可见
	 * @param xpathExpression xpath表达式
	 * @return true 可见 , false 不可见
	 */
	public Boolean isDisplayedElement(By baseBy, String xpathExpression);

	/**
	 * 返回一个元素下的某个元素是否可见，元素不存在或者"style"属性为不显示都返回false<br>
	 * 注意：根据 xpathExpression 表达式定位到多个元素会返回第一个元素是否可见
	 * @param baseBy 基准元素，只有等待该元素出现后才会判断指定元素是否可见
	 * @param element WebElement
	 * @param xpathExpression xpath表达式，注：此表达式要能使用在WebElement上，可能需要添加child::node()。例：By.xpath("child::node()//span[@class='del']")
	 * @return true 可见 , false 不可见
	 */
	public Boolean isDisplayedElement(By baseBy, WebElement element, String xpathExpression);
}
